/*
 * FileName:    SimpleEditAction.java
 * Description: 共通編集Action
 * History:     2010-10-21 (廖宝俊) 1.0 Create
 */
package com.sn.system.common.action;

import java.io.Serializable;

import javax.servlet.http.HttpServletRequest;

import com.sn.system.common.service.ICommonService;

import org.apache.struts2.ServletActionContext;
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;
import org.springframework.util.StringUtils;

import com.opensymphony.xwork2.ActionSupport;

public class SimpleEditAction extends ActionSupport{

	/** データー対象の編集用service */
	private ICommonService editService;

	/** 編集されるデーター対象 */
	private Object editObj;

	/** データー対象キーの名 */
	private String objIdName;

	/** タイプ：値は‘submit’の場合、更新データー */
	private String submitType;

	/**
     * 編集を実施
     */
	public String execute() throws Exception{
		//formview
		String viewString="formView";
		BeanWrapper editObjWrapper = new BeanWrapperImpl(editObj);
		Object id=null;
		if (editObjWrapper.isReadableProperty(objIdName)){
			id=editObjWrapper.getPropertyValue(objIdName);
		}

		if(id!=null||(submitType!=null&&submitType.equals("submit"))){
			if(submitType!=null&&submitType.equals("submit")){
				//データー対象が編集する前の処理方法
				beforeSaveObject();

				editService.save(editObj);

				//データー対象が編集した後の処理方法
				afterSaveObject();

				//編集成功した後のview
				viewString="saveView";
			}
			else{
				//編集されるデーター対象が設置する前の処理方法
				beforeSetDefaultValue();

				Class objClass=getObjClass();
				setEditObj(editService.selectObject(objClass, (Serializable)id));

				//編集されるデーター対象が設置した後の処理方法
				afterSetDefaultValue();
			}
		}else{
			//ヌルを設置した後の処理方法
			afterSetEmptyValue();
		}
		return viewString;
	}

    /**
     * 反射は対象のタイプを得ます
     */
	private Class getObjClass( ) {
		Class objClass=null;
		try {
			String cn=editObj.getClass().getName().toString();
			objClass=Class.forName(cn);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		return objClass;
	}

    /**
     * 編集されるデーター対象が設置した後の処理方法
     */
	protected void afterSetDefaultValue() {

	}

    /**
     * 編集されるデーター対象が設置する前の処理方法
     */
	protected void beforeSetDefaultValue() {

	}

    /**
     * データー対象が編集する前の処理方法
     */
	protected void beforeSaveObject() {

	}

    /**
     * データー対象が編集した後の処理方法
     */
	protected void afterSaveObject() {

	}

    /**
     * ヌルを設置した後の処理方法
     */
	protected void afterSetEmptyValue() {

	}

	private Serializable getObjId(Serializable objId){
		Serializable aa=null;
		return aa;
	}



	public Object getEditObj() {
		return editObj;
	}

	public void setEditObj(Object editObj) {
		this.editObj = editObj;
	}

	public String getObjIdName() {
		return objIdName;
	}

	public void setObjIdName(String objIdName) {
		this.objIdName = objIdName;
	}

	public String getSubmitType() {
		return submitType;
	}

	public void setSubmitType(String submitType) {
		this.submitType = submitType;
	}


	public void setEditService(ICommonService editService) {
		this.editService = editService;
	}

}
